import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common';

// 自定义管道实现参数转换和过滤
@Injectable()
export class ParamTransformPipe implements PipeTransform {
  // value: 当前处理的参数值
  // metadata: 参数元数据，包含参数类型和数据
  transform(value: any, metadata: ArgumentMetadata) {
    // 根据参数类型进行不同处理
    switch (metadata.type) {
      case 'body':
        return this.transformBody(value);
      case 'query':
        return this.transformQuery(value);
      case 'param':
        return this.transformParam(value);
      default:
        return value;
    }
  }

  // 处理请求体参数
  private transformBody(body: any): any {
    if (typeof body !== 'object' || body === null) {
      return body;
    }

    // 示例：移除所有空字符串属性
    const result = { ...body };
    for (const key in result) {
      if (result[key] === '') {
        delete result[key];
      }
    }
    return result;
  }

  // 处理查询参数
  private transformQuery(query: any): any {
    if (typeof query !== 'object' || query === null) {
      return query;
    }

    // 示例：将查询参数中的字符串'true'/'false'转换为布尔值
    const result = { ...query };
    for (const key in result) {
      if (result[key] === 'true') {
        result[key] = true;
      } else if (result[key] === 'false') {
        result[key] = false;
      }
    }
    return result;
  }

  // 处理路径参数
  private transformParam(param: any): any {
    // 示例：移除路径参数中的空格
    if (typeof param === 'string') {
      return param.trim();
    }
    return param;
  }
}
